package com.webserver.controller;

import com.webserver.controller.annotations.Controller;
import com.webserver.controller.annotations.RequestMapping;
import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;
import com.webserver.vo.User;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 用来处理和用户相关的业务操作
 */
@Controller  //注解  表示是业务处理类
public class UserController {
    //保存素所有用户信息的目录名字
    private static String userDirName = "./users/";

    static  {
        File userDir = new File(userDirName);//读内容
        if (!userDir.exists()){//判断文件是否存在
            userDir.mkdirs();//没有存在的话创建一个新文件
        }
    }

    /**
     * 用来处理用户注册操作
     * @param request
     * @param response
     */
    @RequestMapping("./myweb/regUser")
    public void reg(HttpRequest request, HttpResponse response){
        System.out.println("开始处理用户注册...");
        //1:从request中获取用户表单上提交的注册信息
        //注:request.getParameter()获取表单输入框上的内容要传递的参数为改改输入框name=""属性指定的值
        String username = request.getParameter("username");//给定的值需要和注册页面的名字一致
        String password = request.getParameter("password");//给定的值需要和注册页面的名字一致
        String nickname = request.getParameter("nickname");//给定的值需要和注册页面的名字一致
        String ageStr = request.getParameter("age");//给定的值需要和注册页面的名字一致
        System.out.println(username+","+password+","+nickname+","+ageStr);
        /*
            必要的验证工作,保证注册的四个信息不为空,否则响应注册失败的提示页面
            年龄还要必须是一个数字格式.
            失败界面:reg_eeror.html,注重显示一行字:注册失败,输入信息有误,请重新重注册
         */
        if (username==null||password==null||nickname==null||ageStr==null||
             !ageStr.matches("[0-9]+")) {//判断是否根据给定的正则表达式匹配  取反
            response.setEntity(new File("./webapps/myweb/reg_error.html"));
            return;
        }
        /*
            判断是否为重复用户,如果是重复用户则直接响应界面reg_hava.uesr.html
            该页面居中显示一行字:该用户以存在
         */
        File userFiel = new File(userDirName+username+".obj");
        if (userFiel.exists()){
            response.setEntity(new File("./webapps/myweb/reg_hava.uesr.html"));
            return;
        }



        int age = Integer.parseInt(ageStr);//转换成int值

        //2:将改用户信息写入磁盘保存
        User user = new User(username,password,nickname,age);

        try (
                //对象序列化流  高级流
                ObjectOutputStream oos = new ObjectOutputStream(
                        //相当于./users/zhangsan.obj
                        new FileOutputStream(userDirName+username+".obj")
                );
        ){
            oos.writeObject(user);//序列化

            response.setEntity(new File("./webapps/myweb/reg_success.html"));

        } catch (IOException e) {
            e.printStackTrace();
        }





        //3:设置response响应注册结果页面

        System.out.println("用户注册处理完毕!!!");



    }
    //处理登录业务得方法
    @RequestMapping("/myweb/loginUser")
    public void login(HttpResponse response,HttpRequest request) {
        System.out.println("开始处理登录...");
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if(username==null||password==null){
            response.setEntity(new File("./webapps/myweb/login_error.html"));
            return;
        }

        File userFile = new File(userDirName+username+".obj");
        if(userFile.exists()){
            try(
                    ObjectInputStream ois = new ObjectInputStream(
                            new FileInputStream(userFile)
                    )
            ){
                User user = (User)ois.readObject();
                //比较密码
                if(user.getPassword().equals(password)){
                    //登录成功
                    response.setEntity(new File("./webapps/myweb/login_success.html"));
                    return;
                }
            }catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
        }
        response.setEntity(new File("./webapps/myweb/login_fail.html"));
        System.out.println("登录处理完毕!!!");


    }

    /**
     * 生成展示所有注册用户信息的动态页面
     * @param request
     * @param response
     */
    @RequestMapping("/myweb/showAllUser")
    public void showAllUser(HttpRequest request,HttpResponse response){

        System.out.println("开始生成动态页面...");
        /*
            1:将users目录下的所有.obj文件获取到.并逐个进行反序列化来得到若干的User对象.
            然后将这些User对象都存入到一个List集合备用
         */
        List<User>  userList = new ArrayList<>();


            File userDir = new File(userDirName);
            File[] subs = userDir.listFiles(f->f.getName().endsWith(".obj"));
            for(File userFile : subs){
                try (
                        ObjectInputStream ois = new ObjectInputStream(
                                new FileInputStream(userFile)
                        )
                        ){
                    userList.add((User)ois.readObject());

                }catch (IOException | ClassNotFoundException e){
                    e.printStackTrace();
                }
            }

            userList.forEach(System.out::println);



                PrintWriter pw = response.getWrite();
                pw.println("<!DOCTYPE html> ");
                pw.println("<html lang=\"en\"> ");
                pw.println(" <head> ");
                pw.println("<meta charset=\"UTF-8\"> ");
                pw.println("<title>用户列表</title>\n ");
                pw.println(" </head>");
                pw.println("<body> ");
                pw.println(" <center> ");
                pw.println("  <h1>用户列表</h1>");
                pw.println(" <table border=\"1\"> ");
                pw.println(" <tr>");
                pw.println(" <td>用户名</td>");
                pw.println("<td>密码</td> ");
                pw.println("  <td>昵称</td>");
                pw.println("  <td>年龄</td>");
                pw.println(" </tr> ");
                //遍历输入 已经存在/注册的用户
                for (User user : userList) {
                    pw.println("<td>"+user.getUsername()+"</td>");
                    pw.println("<td>"+user.getPassword()+"</td>");
                    pw.println("<td>"+user.getNickname()+"</td>");
                    pw.println("<td>"+user.getAge()+"</td>");
                    pw.println("</td>");
                }
                pw.println("  </table>");
                pw.println(" </center> ");
                pw.println("  </body> ");
                pw.println("</html> ");
                //设置正文类型

        response.setContentType("text/html");

        System.out.println("动态页面生成完毕!");
    }


}
